mod func;

fn main() {
    println!("Hello, world!");

    // rust 声明变量用let
    let a = 5_0;
    println!("a={}", a);

    // 默认是不可变的，修改时会编译不通过
    // a = 7;

    // 显示声明可变变量
    // 类型与变量名之间加:
    let mut b: i32 = 1;
    println!("Before change: b={}", b);

    //  也可以把类型放到数值的后面 :-D
    let c = 1_i32;
    println!("c={}", c);

    b = 3;
    println!("After change: b={}", b);

    // mut 关键字
    // 1. 声明时在变量名前
    // 2. 传参数时，在变量名前
    // 3. 定义函数时，在类型前
    refer(& mut b);
    println!("After changed by refer b={}", b);

    translate();
}

fn refer(b:& mut i32) {
    *b = 80_i32;
}

fn translate() {
    // 1. 数值之间转换 

    // 尝试将一个浮点数赋值给整型变量
    // 编译不通过，不允许直接赋值。这是rust的类型系统强制的。
    // let mut f:i32 = 1.0;

    // 通过as 将它转换为整数，直接丢掉小数
    let mut f: i32 = 1.5 as i32;
    println!("Float f={}", f);
    f = 80;
    println!("Float changed f={}", f);

    // 2. 字符串和数值转换
    // i32这里叫type annotation，不加它编译器会报错。因为parse的实现可以转换为多个类型，不加时它不知道
    // 要把转换成什么类型。
    let a : i32 = "25".parse().expect("failed to parse");
    println!("Parsed result a={}", a);

    let b : f32 = "25".parse().expect("failed to parse");
    println!("Parsed result b={}", b);

    // 不能转换将panicked
    // let c : f32 = "25a".parse().expect("failed to parse");
    // println!("Parsed result c={}", c);
    //
    let s = b.to_string();
    println!("Got string s={}", s);

    // func
    func::entry();
}
